#pragma once
#include<iostream>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>


void MyDaemon()
{
    //1.忽略信号.
    //SIGPIPE(此信号表示一个算术运算异常，比如除0、浮点溢出等，该信号的默认处理动作是终止进程，同时产生一个core文件。)
    //SIGCHLD(在一个进程终止或停止时，SIGCHLD信号被发送给其父进程。按系统默认，将忽略此信号。如果父进程希望被告知其子进程的这种状态改变，则应捕捉此信号。信号捕捉函数中通常要调用一种wait函数以取得子进程ID及其终止状态。).使进程不会因为一些异常信号而终止了
    signal(SIGPIPE,SIG_IGN);
    signal(SIGCHLD,SIG_IGN);


    //2.不要让自己成为组长，-用fork
    if(fork()>0)exit(0);//终止父进程

    //走到这一句是子进程了，可以保证他不是组长



    //3.调用setsid-自成一个会话
    setsid();



    //4.标准输入，标准输出，标准错误的重定向。守护进程不能直接向显示器打印东西。因为他已经是一个独立的进程了。
    //因为终端是和会话的关联的，但是这个自成会话的进程没有终端，而且打印是向终端的显示器上打的，所以不可以打印到终端上。
    //一旦打了进程可能暂停甚至终止。所以不能用cout向显示器上打印，要fprintf向文件里打印
    int devnull=open("/dev/null",O_RDONLY | O_WRONLY);//打开黑洞文件
    if(devnull>0)
    {
        //打开成功，进行重定向.用dup2
        dup2(0,devnull);//将0号文件描述符，重定向从标准输入文件到devnull文件
        dup2(1,devnull);
        dup2(2,devnull);
        close(devnull);
    }

}